;#############################
;命令：
;nasm -f elf64 day2_0function_1call_function_with_multiple_parameters_3pro.asm -o main.o && gcc main.o -o main -lc -no-pie && ./main
;输出：
;传入参数为：1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
;传入参数为：1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
;传入参数为：1, 2, 3, 4, 5, 6, 7, 8
;#############################
extern printf

section .data
	msg0: db `传入参数为：%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d\n`, 0
	msg1: db `传入参数为：%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d\n`, 0
	msg2: db `传入参数为：%d, %d, %d, %d, %d, %d, %d, %d\n`, 0

section .text
	global main

main:
	push rbp
	mov rbp, rsp

;###########################################
	push 15
	push 14
	push 13
	push 12
	push 11
	push 10
	push 9
	push 8
	push 7
	push 6
	mov r9, 5
	mov r8, 4
	mov rcx, 3
	mov rdx, 2
	mov rsi, 1
	mov rdi, msg0
	call printf

	add rsp, 80
	;这个例子其实是讲
	;如果例子是恰到好处的话
	;其实不需要在push前补充
	;sub rsp, 8
	;很多情况都是以恰到好处的形式存在的
;###########################################

;##########################################
	sub rsp, 8
	push 12
	push 11
	push 10
	push 9
	push 8
	push 7
	push 6
	mov r9, 5
	mov r8, 4
	mov rcx, 3
	mov rdx, 2
	mov rsi, 1
	mov rdi, msg1
	call printf

	add rsp, 64
	;请注意
	;stack的申请和释放对齐16的整数倍
	;add rsp, 64是为了满足这一要求
	;sub rsp, 8也是为了凑64这个数
;##########################################

;########################
	sub rsp, 8
	push 8
	push 7
	push 6
	mov r9, 5
	mov r8, 4
	mov rcx, 3
	mov rdx, 2
	mov rsi, 1
	mov rdi, msg2
	call printf

	add rsp, 32
;########################

	mov eax, 0
	leave
	ret
